"""
红包是广受欢迎的一种移动客户端互动方式。
请设计一个抢红包系统，例如AI一组共13人，每人必须发一次，顺序任意。
当A同学发红包时其余同学抢红包，每一个同学发完红包后输出本轮抢红包的运气王和倒霉王以及没抢到红包的组员。
所有人都发完红包后再得出这个游戏的运气王和倒霉王。
即共输出14次运气王和倒霉王。
这13名同学有自己的总金额total，发红包时的个数num(个数就是有num个人能抢到红包)自定。
每个同学发红包时的总金额payment自定，payment必然小于total，抢到的红包总金额get_money。
要求：
     每个用户的红包个数num属性不允许在类的外部被使用
     每个红包里的金额随机生成，并保留两位小数；总金额由用户输入
     在每个成员发放红包时：得到红包的成员随机生成，每位成员最多只可以抢到一个红包
     其余要求结合实际抢红包规则
"""
import random
from decimal import Decimal

class Member(object):

	def __init__(self, name, total, payment, num):  # total钱包金额， payment发的红包金额， num红包个数
		self.name = name
		self.total = total
		self.payment = payment
		self.__num = num
		self.get_money = 0

	def red_packet(self, Members_1):  # Members_1是存储组内成员对象的列表, payment是红包金额, num为红包个数
		random.shuffle(Members_1)  # 随机Member列表
		i = 0
		remain = Decimal(f"{self.payment:.2f}")  # 存储红包金额
		self.payment = 0
		get_money = []  # 存储每个用户抢到的钱
		while i < self.__num - 1:  # 前num个人有红包
			money = Decimal(f"{random.uniform(0.01, float(remain - Decimal(str((self.__num - i - 1) * 0.01)))):.2f}")
			Members_1[i].get_money = float(f"{float(money + Decimal(str(Members_1[i].get_money))):.2f}")  # 这一步为了确定剩下的人都能抢到红包
			get_money.append(float(money))
			remain -= money
			i += 1

		Members_1[i].get_money = float(f"{float(remain + Decimal(str(Members_1[i].get_money))):.2f}")  # 最后一个人获得红包中剩下的金额
		remain = float(f"{remain:.2f}")
		get_money.append(remain)
		# print(get_money)
		noMoney_Members = Members_1[self.__num:]
		print(f"{self.name}的红包情况如下：")
		if not noMoney_Members:
			print(f"大家都有份！！")
		else:
			for member in noMoney_Members:
				print(f"{member.name}", end=" ")
			print("没抢到红包。。。")
		max_money = max(get_money)  # 抢到的最大红包
		# print(max_money)
		min_money = min(get_money) # 抢到的最小红包
		# print(min_money)
		if get_money.count(max_money) == 1:
			print(f"运气王是{Members_1[get_money.index(max_money)].name}，抢到的金额是{max_money}。")
		else:
			luckyNum = get_money.count(max_money) - 1
			print(f"运气王是{Members_1[get_money.index(max_money)].name}", end="，")
			index = get_money.index(max_money) + 1
			while luckyNum:
				print(Members_1[get_money.index(max_money, index)].name, end="，")
				index = get_money.index(max_money, index) + 1
				luckyNum -= 1
			print(f"抢到的金额是{round(max_money, 2)}。")
		if get_money.count(min_money) == 1:
			print(f"倒霉王是{Members_1[get_money.index(min_money)].name}，抢到的金额是{min_money}。")
		else:
			noLuckyNum = get_money.count(min_money) - 1
			print(f"倒霉王是{Members_1[get_money.index(min_money)].name}", end="，")
			index = get_money.index(min_money) + 1
			while noLuckyNum:
				print(Members_1[get_money.index(min_money, index)].name, end="，")
				index = get_money.index(min_money, index) + 1
				noLuckyNum -= 1
			print(f"抢到的金额是{round(min_money, 2)}。")
		print("*"*10)


def createMembers():  # membersNum为成员个数
	membersNum = int(input("请输入成员个数:"))
	members = []
	members_1 = []  # 用于shuffle随机
	for i in range(membersNum):
		print(f"请第{i+1}个用户依次按提示内容输入。")
		total = float(input("输入你钱包金额（两位小数）:"))
		num = int(input("输入红包个数:"))
		while num > membersNum or num <= 0:
			if num > membersNum:
				print("红包个数有点多，请重新输入！！")
				num = int(input("输入红包个数:"))
			else:
				print("红包数有点诡异，重新输入!!")
				num = int(input("输入红包个数:"))
		payment = float(input("输入红包金额（两位小数）:"))
		while payment > total or payment < num*0.01:
			if payment < num*0.01:
				print("钱太少了，不够分!!!")
				payment = float(input("输入红包金额（两位小数）:"))
			else:
				print("没有那么多钱!!")
				payment = float(input("输入红包金额（两位小数）:"))
		member = Member("学生" + str(i+1), total, payment, num)
		members.append(member)
		members_1.append(member)
	return members, members_1


def game(Members, Members_1):
	for i in range(len(Members)):
		Members[i].red_packet(Members_1)
	get_money = []
	for i in range(len(Members)):
		get_money.insert(i, Members[i].get_money)
	max_money = max(get_money)  # 抢到的红包金额总和最大
	min_money = min(get_money)  # 抢到的红包金额总和最小
	print("本次游戏运气王以及倒霉王分别为:")
	if get_money.count(max_money) == 1:
		print(f"运气王是{Members[get_money.index(max_money)].name}，抢到的总金额为{Members[get_money.index(max_money)].get_money}")
	else:
		luckyNum = get_money.count(max_money) - 1
		print(f"运气王是{Members[get_money.index(max_money)].name}", end="，")
		index = get_money.index(max_money) + 1
		while luckyNum:
			print(Members[get_money.index(max_money, index)].name, end="，")
			index = get_money.index(max_money, index) + 1
			luckyNum -= 1
		print(f"他们抢到的总金额为{Members[get_money.index(min_money)].get_money}")
	if get_money.count(min_money) == 1:
		print(f"倒霉王是{Members[get_money.index(min_money)].name}，抢到的总金额为{Members[get_money.index(min_money)].get_money}")
	else:
		noLuckyNum = get_money.count(min_money) - 1
		print(f"运气王是{Members[get_money.index(min_money)].name}", end=" ")
		index = get_money.index(min_money) + 1
		while noLuckyNum:
			print(Members[get_money.index(min_money, index)].name, end=" ")
			index = get_money.index(min_money, index) + 1
			noLuckyNum -= 1
		print(f"他们抢到的总金额为{Members[get_money.index(min_money)].get_money}")
	for member in Members:
		print(f"{member.name}抢到的红包总金额为{member.get_money}")


if __name__ == "__main__":
	Members, Members_1 = createMembers()
	game(Members, Members_1)